perm filename PASSER.BAK[V,VDS] blob
sn#372084 filedate 1978-08-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE PASSER
C00005 00003 SCAN FOR START OF DATA BLOCK AND THEN FILL TTY BUFFER
C00008 00004 OUTPUT THE TTY BUFFER
C00009 00005 PROCEDURES: GETNME,GET6BT
C00011 00006 PROCEDURES: GETCHR,PACK
C00013 00007 LOCAL STORAGE AREA
C00014 ENDMK
C⊗;
TITLE PASSER
;PASSER CAN BE USED TO TRANSFER DISK FILES IN PDP11 BINARY
;FORMAT OVER A TTY PHONE LINE. THE BINARY 16 BIT WORDS
;ARE SENT 6 BITS AT A TIME, THREE BYTES TO A WORD.
;DEFINITIONS
P←17 ;PUSH STACK POINTER
FILE←1 ;DISK FILE CHANNEL
COUNT←4 ;NUMBER OF BYTES LEFT IN BLOCK
OLDB←5 ;OLD TTY BUFFER
NEWB←6 ;NEW TTY BUFFER
TTYB←7 ;TTY BUFFER BYTE POINTER
DPBP←10 ;DPB POINTER
DMES←11 ;DONE MESSAGE
;INITIALIZE PROGRAM AND INPUT DISK FILE
PASSER: RESET
MOVE P,[XWD -50,PDL-1] ;INITIALIZE PUSH STACK
OUTSTR [ASCIZ /
BINARY FILE PASSER PROGRAM
/]
INIT FILE,10 ;INITIALIZE DISK CHANNEL
SIXBIT /DSK/
IBUF
HALT .
INBUF FILE,4 ;SET UP BUFFER RING
ASKNME: OUTSTR [ASCIZ /FILE NAME = /]
PUSHJ P,GETNME ;DECODE NAME TO SIXBIT
SETZM INAME+3 ;USE THIS JOB'S PPN
LOOKUP FILE,INAME ;OPEN FILE FOR READING
JRST [ OUTSTR [ASCIZ /***LOOK UP FAILED, TRY AGAIN**
/]
JRST ASKNME ]
;CHANGE TTY CHARACTERISTICS
CLRBFI
OUTSTR [ASCIZ /TYPE (CNTRL)G TO START TRANSFER: /]
SETOM TTYBIT ;SAVE AND CHANGE TTY BITS TO
GETLIN TTYBIT ; PASS EACH CHARACTER AS IS
MOVE TTYBIT
TLZ 110010 ;NO ARROW,NO FILL,TAB
TLO 26 ;FULL, NO ECHO
SETLIN
MOVE [-1,,[026000,,1]] ;DONT CONVERT TO STANDARD ASCII
TTYSET
;SCAN FOR START OF DATA BLOCK AND THEN FILL TTY BUFFER
MOVEI NEWB,OBUF1 ;SET UP TTY BUFFER PTRS
MOVEI OLDB,OBUF2
MOVE DPBP,[POINT 8,1,27] ;BYTE PTR TO FORM 16 BIT WORD
MOVEI DMES,[ASCIZ /
[FATAL] CATCHER TERMINATED TRANSFER BEFORE END OF FILE
/]
SCAN: PUSHJ P,GETCHR ;0 ← NEXT BYTE
JRST [ MOVEI DMES,[ASCIZ /
FILE TRANSFER COMPLETED/]
INCHRW
JRST ALLDNE ]; EOF
CAIE 1 ;1 = START OF BLOCK
JRST SCAN
MOVE 1,0
EXCH NEWB,OLDB ;START FILLING NEW TTY BUFFER
MOVE TTYB,[POINT 7,0];FORM BYTE PTR
HRRI TTYB,(NEWB)
PUSHJ P,GETCHR ;ZERO SHOULD FOLLOW THE 1
JRST [DSKERR: OUTSTR [ASCIZ /
[FATAL ERROR] UNEXPECTED EOF/]
JRST PASSDN]
TRNE 0
JRST [ OUTSTR [ASCIZ /
[WARNING] ILLEGAL BLOCK FORMAT ENCOUNTERED/]
JRST .+1]
PUSHJ P,PACK
PUSHJ P,GETCHR ;GET BLOCK LENGTH
JRST DSKERR
MOVE 1,0
PUSHJ P,GETCHR
JRST DSKERR
DPB DPBP ;PUT THE 16 BIT WORD TOGETHER
MOVEI COUNT,(1) ;NUMBER OF CHARACTERS LEFT IN BLOCK
CAIN COUNT,6 ;END OF EXECUTABLE CODE?
JRST [ MOVEI DMES,[ASCIZ /
TRANSFER OF PROGRAM WITHOUT SYMBOLS COMPLETED
/]
JRST .+1]
SUBI COUNT,3
PUSHJ P,PACK2 ;PACK COUNT
PACKBK: PUSHJ P,GETCHR ;PACK THAT BLOCK AWAY
JRST DSKERR
MOVE 1,0
SOJLE COUNT,[ SETZ ;ENDED ON ODD BYTE
JRST ODDBTY ]
PUSHJ P,GETCHR
JRST DSKERR
ODDBTY: PUSHJ P,PACK
SOJG COUNT,PACKBK
SETZ ;TERMINATE TTY OUTPUT STRING
IDPB TTYB
;OUTPUT THE TTY BUFFER
ASKCMD: INCHRW ;WHAT DO WE DO NOW?
CAIN "G" ;G → TYPE NEW TTY BUFFER
JRST [ OUTSTR (NEWB)
JRST SCAN ]
ALLDNE: CAIN "C" ;C → CHECK SUM ERROR, TYPE OLD BUFFER AGAIN
JRST [ OUTSTR (OLDB)
JRST ASKCMD ]
CAIN "D" ;D → END OF TRANSFER
JRST [ OUTSTR (DMES)
JRST PASSDN ]
CAIE "F" ;F → FATAL ERROR, TERMINATE
JRST [ OUTSTR [ASCIZ /
[FATAL ERROR] UNEXPECTED RESPONSE FROM TTY/]
JRST .+1 ]
;EXIT CLEANLY
PASSDN: RELEAS FILE, ;CLOSE DISK FILE
SETLIN TTYBIT ;RESET TTY BITS TO AS BEFORE
EXIT
;PROCEDURES: GETNME,GET6BT
GETNME: MOVE 1,[POINT 6,INAME] ;PACK 6 BIT NAME
SETZM INAME
SPACES: PUSHJ P,GET6BT ;IGNOR LEADING SPACES
JRST SAVCHR
JUMPE SPACES
JRST GETNDN
SAVCHR: IDPB 1 ;SAVE A CHARACTER OF THE NAME
PUSHJ P,GET6BT ;NEXT SIXBIT CHAR
JRST SAVCHR ;LEGAL CHAR
SETZM INAME+1 ;PACK EXTENSION IN HERE
MOVE 1,[POINT 6,INAME+1]
CAIN 16 ;"." SEPARATES NAME AND EXT
JRST CHKEXT
JRST GETNDN
SAVEXT: IDPB 1 ;SAVE EXTENSION CHAR
CHKEXT: PUSHJ P,GET6BT
JRST SAVEXT
GETNDN: CLRBFI
POPJ P,
GET6BT: INCHWL ;GET A CHARACTER
TRZ 40 ;CONVERT ASCII TO SIXBIT
TRZE 100
TRO 40
CAIGE 20 ;SKIP RETURN IF NOT 0 TO Z
AOS (P)
CAILE 72
AOS (P)
POPJ P, ;RETURN
;PROCEDURES: GETCHR,PACK
GETCHR: SOSG IBUF+2 ;NEED A NEW BUFFER?
IN FILE, ;YES, TRY READING SOME MORE
JRST CANGET
STATZ FILE,20000 ;IN FAILED, EOF?
POPJ P, ;YES
OUTSTR [ASCIZ /
[FATAL] DISK INPUT ERROR/]
POPJ P,
CANGET: ILDB IBUF+1 ;GET A WORD
AOS (P) ;TAKE SUCCESS RETURN
POPJ P,
PACK: DPB DPBP ;PUT THE 16 BIT WORD TOGETHER
PACK2: MOVEI (1) ;PACK 6 LSB+1
TRZ 777700
AOJ
CAIL 11 ;LF'S → CR MAP TO 133 TO 137
JRST [ CAIG 15
ADDI 162
JRST .+1 ]
IDPB TTYB
ASH 1,-6 ;PACK NEXT 6 LSB+1
MOVEI (1)
TRZ 777700
AOJ
CAIL 11 ;LF'S → CR MAP TO 133 TO 137
JRST [ CAIG 15
ADDI 162
JRST .+1 ]
IDPB TTYB
ASH 1,-6 ;PACK FINAL 4 BITS
AOJ 1,
CAIL 1,11 ;LF'S → CR MAP TO 133 TO 137
JRST [ CAIG 1,15
ADDI 1,162
JRST .+1 ]
IDPB 1,TTYB
POPJ P,
;LOCAL STORAGE AREA
IBUF: BLOCK 3 ;INPUT BUFFER POINTER
TTYBIT: 0 ;INITIAL TTY STATUS BITS
INAME: BLOCK 4 ;FILE NAME,EXTENSION,0,PPN
OBUF1: BLOCK =2000 ;TTY OUTPUT BUFFERS
OBUF2: BLOCK =2000
PDL: BLOCK 50 ;PUSH STACK
END PASSER